package com.team.mail.order;



import org.springframework.amqp.rabbit.annotation.EnableRabbit;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.alibaba.seata.GlobalTransactionAutoConfiguration;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.EnableAspectJAutoProxy;

/**
 * 1、引入RabbitMQ协议
 *      RabbitAutoConfiguration 就会自动生效
 * 2、给容器自动配置了
 *        amqpAdmin、RabbitTemplate、CachingConnectionFactory、RabbitMessagingTemplate
 *           @ConfigurationProperties(prefix = "spring.rabbitmq")
 *           public class RabbitProperties {
 *
 * 3、给配置文件中配置mq信息
 *
 * 4、开启 @EnableRabbit
 * 5、监听消息 @RabbitListener注解 必须开启@EnableRabbit
 *      只有发消息不需要开启@EnableRabbit
 *    @RabbitListener：类+方法
 *    @RabbitHandler: 标在方法上
 *
 *
 * 6、本地事务生效的问题
 *      同一个对象内的事务方法互调默认失效，原因绕过了代理对象，事务使用代理对象来控制的
 *          解决：使用代理对象来调用事物的方法
 *          1)、引入 spring-boot-starter-aop：引入了 aspectj
 *          2)、EnableAspectJAutoProxy(exposeProxy = true) true就是对外暴漏代理对象 以后的动态代理都是aspectj创建的、而不是jdk默认的动态代理、(即使没用接口也可以创建动态代理)
 *                  OrderServiceImpl o = (OrderServiceImpl) AopContext.currentProxy ();
 *         o.b ();
 *         o.c ();
 *         3)、本类互调用调用对象
 *                      OrderServiceImpl o = (OrderServiceImpl) AopContext.currentProxy ();
 *                          o.b ();
 *                          o.c ();
 *
 * 7、seata控制分布式事务
 *  1)、每一个微服务先必须创建undo_log
 *  2)、安装事务协调器：seata-server: https://github.com/seata/seata/releases
 *  3)、整合
 *          1、导入依赖 spring-cloud-starter-alibaba-seata
 *          2、解压并启动 seata-server:
 *              registry.conf:注册中心配置；修改rgistry type =nacos
 *                 file.conf:
 *          3、所有想要用到分布式事务的微服务使用 seata DataSourceProxy 代理自己的数据源
 *             TODO 因为 Seata 通过代理数据源实现分支事务，如果没有注入，事务无法成功回滚：
 *                  https://github.com/seata/seata-samples/tree/master/springcloud-jpa-seata 文档地址
 *          4、每个微服务必须导入
 *                  registry.conf
 *                  file.conf   vgroup_mapping.{当前应用的名字}-fescar-service-group = "default"
 *           5、启动测试分布式事务
 *           6、给分布式大事务的入口标注 @GlobalTransactional
 *           7、每一个远程的小事务用@Transactional
 *
 */
@EnableAspectJAutoProxy(exposeProxy = true)
@EnableRabbit
@EnableDiscoveryClient
@EnableFeignClients
@SpringBootApplication(exclude = GlobalTransactionAutoConfiguration.class)
public class MallOrderApplication {

    public static void main(String[] args) {
        SpringApplication.run(MallOrderApplication.class, args);
    }

}
